package cn.zhc.com.utils;

import android.app.Activity;
import android.content.Context;
import android.content.pm.ActivityInfo;
import android.os.Build;
import android.os.Trace;
import android.view.View;
import android.view.Window;
import android.view.WindowManager;

import java.lang.reflect.Field;
import java.lang.reflect.Method;

import cn.zhc.com.R;

/**
 * Created by zhouhongchun on 2017/8/14.
 * <p>
 * 1、状态栏相关
 * 2、屏幕宽高相关
 * 3、dp和px互转
 */

public class UtilsUI {
    /**
     * 根据手机的分辨率从 dp 的单位 转成为 px(像素)
     */
    public static int dip2px(Context context, float dipValue) {
        final float scale = context.getResources().getDisplayMetrics().density;
        return (int) (dipValue * scale + 0.5f);
    }

    /**
     * 根据手机的分辨率从 px(像素) 的单位 转成为 dp
     */
    public static int px2dip(Context context, float pxValue) {
        final float scale = context.getResources().getDisplayMetrics().density;
        return (int) (pxValue / scale + 0.5f);
    }

    /**
     * 设置屏幕的方向
     */
    public static void setScreenOrientation(Activity activity, int requestedOrientation) {
        if (requestedOrientation == ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE) {
            activity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);//强制为横屏
            return;
        }
        activity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);//竖屏
    }

    /**
     * 获取屏幕宽度，单位像素
     */
    public static int getScreentWidth(Context context) {
        return context.getResources().getDisplayMetrics().widthPixels;
    }

    /**
     * 获取屏幕高度，单位像素
     */
    public static int getScreentHeight(Context context) {
        return context.getResources().getDisplayMetrics().heightPixels;
    }

    /**
     * 获取屏幕密度
     */
    public static float getScreentDensity(Context context) {
        return context.getResources().getDisplayMetrics().density;
    }


    /**
     * 1、沉浸式全屏模式 ,隐藏status bar（状态栏）使屏幕全屏，
     * 让Activity接收所有的（整个屏幕的）触摸事件。简单来说沉浸的就是全屏，
     * 点按屏幕或者从顶部向下滑能滑出状态栏的那种，参考看视频时的效果。
     * <p>
     * 2、透明化系统状态栏（本方法的实际需求），使得布局侵入系统栏的后面，
     * 必须启用fitsSystemWindows属性来调整布局才不至于被系统栏覆盖（貌似不需要）。
     */
    public static void initStateStatusColor(Activity activity, int type) {
        try {
            Window mWindow = activity.getWindow();
            if (type == 1) {
                //去掉Activity上面的状态栏，手指下滑可脱出状态栏，播放视频是可用到，其他的建议不要用
                mWindow.setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);
                return;
            }

            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
                //   getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
                mWindow.clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
                //需要设置这个 flag 才能调用 setStatusBarColor 来设置状态栏颜色
                mWindow.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);

                if (!initMEIZUStatusColor(mWindow, true) && !initMIUIStatusColor(mWindow, true) && Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
                    //android6.0及以上系统
                    mWindow.getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN | View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR);
                    //代码修改状态栏背景颜色
                    mWindow.setStatusBarColor(activity.getResources().getColor(R.color.colorPrimaryDark));
                    return;
                } else {
                    mWindow.addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
                    mWindow.setStatusBarColor(activity.getResources().getColor(R.color.status_transparent));
                }

            }
        } catch (Exception e) {
            e.printStackTrace();
        }

    }


    /**
     * 设置状态栏字体图标为深色，需要MIUIV6以上
     *
     * @param window 需要设置的窗口
     * @param dark   是否把状态栏字体及图标颜色设置为深色
     * @return boolean 成功执行返回true
     */
    private static boolean initMIUIStatusColor(Window window, boolean dark) {
        boolean result = false;
        try {
            Class clazz = window.getClass();
            int darkModeFlag;
            Class layoutParams = Class.forName("android.view.MiuiWindowManager$LayoutParams");
            Field field = layoutParams.getField("EXTRA_FLAG_STATUS_BAR_DARK_MODE");
            darkModeFlag = field.getInt(layoutParams);
            Method extraFlagField = clazz.getMethod("setExtraFlags", int.class, int.class);
            extraFlagField.invoke(window, dark ? darkModeFlag : 0, darkModeFlag);
            result = true;
        } catch (Exception e) {
            e.printStackTrace();
        }
        return result;
    }

    /**
     * 设置状态栏图标为深色和魅族特定的文字风格，Flyme4.0以上
     * 可以用来判断是否为Flyme用户
     *
     * @param window 需要设置的窗口
     * @param dark   是否把状态栏字体及图标颜色设置为深色
     * @return boolean 成功执行返回true
     */
    private static boolean initMEIZUStatusColor(Window window, boolean dark) {
        boolean result = false;
        try {
            WindowManager.LayoutParams lp = window.getAttributes();
            Field darkFlag = WindowManager.LayoutParams.class
                    .getDeclaredField("MEIZU_FLAG_DARK_STATUS_BAR_ICON");
            Field meizuFlags = WindowManager.LayoutParams.class
                    .getDeclaredField("meizuFlags");
            darkFlag.setAccessible(true);
            meizuFlags.setAccessible(true);
            int bit = darkFlag.getInt(null);
            int value = meizuFlags.getInt(lp);
            if (dark) {
                value |= bit;
            } else {
                value &= ~bit;
            }
            meizuFlags.setInt(lp, value);
            window.setAttributes(lp);
            result = true;
        } catch (Exception e) {
            e.printStackTrace();
        }
        return result;
    }


}
